package api

import (
	"gitee.com/liuxiaowei123/vblog-3/app/token"
	"gitee.com/liuxiaowei123/vblog-3/ioc"
	"gitee.com/liuxiaowei123/vblog-3/response"
	"github.com/gin-gonic/gin"
)

const Appname = "apitoken"

// 定义实现token api接口层的结构体
type TokenApiHandler struct {
	tksvc token.TokenService
}

func init() {
	ioc.Apihandler().Registry(&TokenApiHandler{})
}
func (t *TokenApiHandler) Init() {
	t.tksvc = ioc.Controller().Get(token.Appname).(token.TokenService)
}
func (t *TokenApiHandler) Name() string {
	return Appname
}

func NewTokenApiHandler(ts token.TokenService) *TokenApiHandler {
	return &TokenApiHandler{
		tksvc: ts,
	}
}

// 该方法用于在一个给定的 gin.IRouter 上注册一个 /v1/token 的 POST 路由
func (t *TokenApiHandler) Registry(r gin.IRouter) {
	r1 := r.Group("/v1")
	// http://localhost:8899/api/vblog3/v1/token
	r1.POST("/token", t.Login)
}

/***
关于gin.IRouter的解释
	gin.IRouter 是 Gin 框架中用于定义路由的接口

关于r1 := r.Group("/v1")的解释
	通过调用 r.Group("/v1")，我们创建了一个新的路由组 r1。这意味着，接下来在这个路由组下定义的所有路由都会以 /v1 作为前缀。
	例如，如果你在这个组下定义了一个 /token 路由，那么完整的 URL 将会是 /v1/token。

关于r1.POST("/token", t.Login)的解释
	在路由组 r1 下，我们定义了一个 POST 方法的路由 /token/。当客户端向这个 URL 发送 POST 请求时，将会调用
	TokenApiHandler 实例 t 的 Login 方法来处理请求。
***/

// 扩展TokenApiHandler的方法，实现路由中的Login函数
func (t *TokenApiHandler) Login(c *gin.Context) {
	// 1、获取用户请求
	tkreq := token.NewLoginRequest()
	err := c.BindJSON(tkreq)
	if err != nil {
		// c.JSON 是一个用于发送 JSON 响应到客户端的方法
		// c.JSON(http.StatusBadRequest, err.Error())
		response.Failed(c, err)
		return
	}

	// 2、处理请求
	tk, err := t.tksvc.Login(c.Request.Context(), tkreq)
	if err != nil {
		// c.JSON(http.StatusBadGateway, err)
		response.Failed(c, err)
	}
	// 2.1、通过SetCookie向客户端写入access_token
	c.SetCookie(token.TOKEN_COOKIE_NAME, tk.AccessToken, 0, "/", "localhost", false, true)

	// 3、返回响应
	// c.JSON(http.StatusOK, tk)
	response.Success(c, tk)
}
